.global Dedic_IO_PORT_SWD_SETUP_ASM
.type Dedic_IO_PORT_SWD_SETUP_ASM, @function
.align 4
Dedic_IO_PORT_SWD_SETUP_ASM:
    entry   sp, 16             // 减少栈空间使用
    // 
    movi    a10, 0x03 //
    movi    a11, 0x03
    //PIN_SWCLK_TCK,PIN_SWDIO_TMS输出高
    //EE.WR_MASK_GPIO_OUT as, ax
    //其中ax 低8-bit 存储掩码，as低8-bit 存储赋值内容。
    ee.wr_mask_gpio_out a3, a2
    retw

    
.global Dedic_IO_SWJ_Sequence_ASM
.type Dedic_IO_SWJ_Sequence_ASM, @function
/*
 * void Dedic_IO_SWJ_Sequence_ASM(
 *     uint32_t count,        // a10 (调用约定第一个参数)
 *     const uint8_t *data,   // a11 (第二个参数)
 *     uint32_t clock_delay   // a12 (第三个参数)
 * );
 */
.align 4
Dedic_IO_SWJ_Sequence_ASM:
    entry   sp, 16             // 分配栈空间(16字节)
    
    // 保存被调用者保存寄存器
    s32i    a12, sp, 0        // 保存原始a12(clock_delay)
    s32i    a13, sp, 4        // 保存a13(val)
    s32i    a14, sp, 8        // 保存a14(SWDIO掩码)
    s32i    a15, sp, 12       // 保存a15(SWCLK掩码)

    // 初始化GPIO掩码(假设SWCLK=GPIO0, SWDIO=GPIO1)
    movi    a15, 0x01         // SWCLK掩码(0b01)
    movi    a14, 0x02         // SWDIO掩码(0b10)

    // 初始化状态变量
    movi    a13, 0            // val = 0
    movi    a2, 0             // n = 0 (使用a2作为n的临时寄存器)

bit_loop:
    beqz    a10, exit_loop    // while (count--)
    addi    a10, a10, -1      // count--

    // 检查是否需要加载新字节
    bnez    a2, process_bit   // if (n == 0)
    l8ui    a13, a11, 0       //   val = *data (加载8位无符号整数)
    addi    a11, a11, 1       //   data++
    movi    a2, 8             //   n = 8

process_bit:
    // 设置SWDIO电平(使用条件移动替代分支)
    extui   a5, a13, 0, 1     // 提取val的最低位(a5 = val & 0x1)
    movi    a6, 0             // 预设低电平值
    movnez  a6, a14, a5       // 如果最低位为1则设为高电平
    ee.wr_mask_gpio_out a6, a14 // 原子更新SWDIO引脚

    // 生成时钟下降沿(SWCLK = 0)
    movi    a6, 0
    ee.wr_mask_gpio_out a6, a15

    // 延时(clock_delay cycles)
    mov     a7, a12           // 使用a12作为延时计数器
delay_loop1:
    addi    a7, a7, -1
    bnez    a7, delay_loop1

    // 生成时钟上升沿(SWCLK = 1)
    mov     a6, a15
    ee.wr_mask_gpio_out a6, a15

    // 再次延时(clock_delay cycles)
    mov     a7, a12
delay_loop2:
    addi    a7, a7, -1
    bnez    a7, delay_loop2

    // 准备下一位
    srli    a13, a13, 1       // val >>= 1
    addi    a2, a2, -1        // n--
    j       bit_loop          // 继续循环

exit_loop:
    // 恢复保存的寄存器
    l32i    a12, sp, 0
    l32i    a13, sp, 4
    l32i    a14, sp, 8  
    l32i    a15, sp, 12
    
    retw                      // 从函数返回